const vscode = require('vscode');
const fs = require('fs');
const { globalStateKey } = require('./config.js');

// 更新treeData.name字段
function updateJsonFile_tag(context, treeDataProvider, item, newValue) {
    const treeData = treeDataProvider.getStorageData()
    let tip = ''
    try {
        if (!item) {
            // 没有item，则添加分类
            tip = '添加'
            treeData.push({
                id: new Date().getTime(),
                name: newValue,
                children: [],
            })
        } else {
            // 有item
            if (newValue) {
                // 有newValue，则修改分类名称
                tip = '更新'
                treeData.forEach(e => {
                    if (e.id === item.id) {
                        e.name = newValue
                    }
                })
            } else {
                // 没有newValue，则删除分类
                tip = '删除'
                const index = treeData.findIndex(e => e.id === item.id)
                if (index !== -1) {
                    treeData.splice(index, 1)
                }
            }
        }

        context.globalState.update(globalStateKey, treeData)
        vscode.window.showInformationMessage(`分类${tip}成功`);
        treeDataProvider.refresh(); // 刷新视图
    } catch (err) {
        vscode.window.showErrorMessage(`分类${tip}失败: ${err.message}`);
    }
}

// 更新treeData片段内容
function updateJsonFile_content(context, treeDataProvider, item, newValue, tagId) {
    const treeData = treeDataProvider.getStorageData()
    let tip = ''
    try {
        if (!item) {
            // 没有item，则在tagId分类下添加子项
            if (tagId) {
                tip = '添加'
                treeData.forEach(e => {
                    e.id === tagId && e.children.push({
                        id: new Date().getTime(),
                        name: newValue.name,
                        content: newValue.content,
                    })
                })
            }
        } else {
            // 有item
            if (newValue) {
                // 有newValue，则修改子项内容
                tip = '更新'
                treeData.forEach(e => {
                    e.children.forEach(e1 => {
                        if (e1.id === item.id) {
                            e1.name = newValue.name
                            e1.content = newValue.content
                        }
                    })
                })
            } else {
                // 没有newValue，则删除子项内容
                tip = '删除'
                treeData.forEach(e => {
                    e.children = e.children.filter(e1 => e1.id !== item.id)
                })
            }
        }

        context.globalState.update(globalStateKey, treeData)
        vscode.window.showInformationMessage(`片段${tip}成功`);
        treeDataProvider.refresh(); // 刷新视图
    } catch (err) {
        vscode.window.showErrorMessage(`片段${tip}失败: ${err.message}`);
    }
}

// 导入文件内容校验
function valid(data) {
    if (!data || !Array.isArray(data)) {
        return true;
    }
    for (const item of data) {
        if (!item.id || !item.children || !item.name || typeof item.name !== 'string') {
            return true;
        }
    }
    return false;
}

// 导入json数据
function importJsonData(context, filePath, callback) {
    try {
        const rawData = fs.readFileSync(filePath, 'utf-8');
        const treeData = JSON.parse(rawData);

        // 导入文件内容校验
        if (valid(treeData)) {
            throw new Error('导入的文件不是有效的 JSON 数组');
        }

        context.globalState.update(globalStateKey, treeData)
        vscode.window.showInformationMessage(`成功导入 ${filePath}`);

        callback()
    } catch (err) {
        vscode.window.showErrorMessage(`导入失败: ${err.message}`);
    }
}

// 导出json数据
function exportJsonData(filePath, treeDataProvider) {
    const data = treeDataProvider.getStorageData()
    try {
        fs.writeFileSync(filePath, JSON.stringify(data, null, 4));
        vscode.window.showInformationMessage(`数据已保存到 ${filePath}`);
    } catch (err) {
        vscode.window.showErrorMessage(`导出失败: ${err.message}`);
    }
}

module.exports = {
    updateJsonFile_tag,
    updateJsonFile_content,
    importJsonData,
    exportJsonData,
}